/***************************************************************************
 *   Copyright (C) 2004 by cyril dupuit                                    *
 *   cyrildupuit@hotmail.com                                               *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

//*****************************************************************************
// Nom du module : Mount.h
// Description : Ce module est utilise pour gerer le system de fichiers virtuel
//*****************************************************************************
 
// Historique :
// 24/01/05 : Creation du module V1.0

#include "Kernel/Types.h"
#include "Lib/LinkList.h"
#include "Lib/Queue.h"

#ifndef VFS_MOUNT_HEADER
#define VFS_MOUNT_HEADER

//*****************************************************************************

#define MOUNT_BROTHER_PRESENT	0x0002
#define MOUNT_CHILD_PRESENT	0x0004

#define MOUNT_NAME_MAX_SIZE 50
#define MOUNT_HASH_TABLE_SIZE 200

//*****************************************************************************

struct VfsMount;

//*****************************************************************************

struct MountNode{
	struct VfsMount	* pNext;//Pointeur sur le descripteur suivant
	struct VfsMount	* pPrev;//Pointeur sur le descripteur precedent
	};

//*****************************************************************************

struct VfsMount {
	struct MountNode Hash;
	struct VfsMount * pParent;
	struct VfsMount * pFirstChild;
	struct VfsMount * pLastChild;
	struct MountNode Mnt;
	Count_t		MntCount;
	Status_t	StatuReg;
	struct VfsMount * pNext;
	struct VfsMount * pPrev;
	char * 		pName;
	};

//*****************************************************************************

typedef struct {
		char * pName;
		struct VfsMount * pMnt;
		unsigned int	Level;
		Status_t Status;
		} VfsMountTree_t;

//*****************************************************************************

//*****************************************************************************
// But de la fonction : Initialiser la liste des descripteurs de montage
// Entree : Aucune
// Parametre retourne : TRUE
//*****************************************************************************
Status_t VfsMountInit(void);

//*****************************************************************************
// But de la fonction : Creer un descripteur de montage et retourner son
// descripteur
// Entree : 
//	pLocation : Pointeur sur l'emplacement
//	pName : Nom du systeme de fichiers
// Parametre retourne : NULL si descripteur non cree, pointeur sur le
// descripteur sinon
//*****************************************************************************
struct VfsMount * VfsMountCreate(char * pLocation, char * pName);

//*****************************************************************************
// But de la fonction : Supprimer un descripteur de montage en fonction de son
// chemin
// Entree : 
//	pLocation : Pointeur sur l'emplacement
//	pName : Nom du systeme de fichiers
// Parametre retourne : FALSE si le descripteur n'a pas ete supprime, TRUE
// sinon
//*****************************************************************************
Status_t VfsMountDelete(char * pLocation, char * pName);

//*****************************************************************************
// But de la fonction : Retourner le nombre de systemes de fichiers montes
// Entree : Aucune
// Parametre retourne : Nombre de systemes de fichiers montes
//*****************************************************************************
Count_t VfsMountCount(void);

//*****************************************************************************
// But de la fonction : Dresser une liste des systemes crees. Cette liste est
// rangee dans une file d'attente fournie en parametre
// Entree :
//	QueueID : Numero d'identification de la file d'attente
// Parametre retourne : ERROR si le numero d'identification de la file
// d'attente est incorrect, FALSE si la file d'attente est trop petite, TRUE
// sinon
//*****************************************************************************
Status_t VfsMountGetList(QueueID_t QueueID);

//*****************************************************************************
// But de la fonction : Dresser un arbre des systemes de fichiers crees.
// Entree : Aucune
// Parametre retourne : 0 si memoire insuffisante, identificateur de la liste
// chaine
//*****************************************************************************
LinkListID_t VfsMountGetTree(void);

//*****************************************************************************

#endif
